// 二项式反演
// 染色问题
// 有 n 个格子排成一排，用 m 种颜色染色，求使得相邻格子
// 不能染上相同的颜色，且 m 种颜色都用上的染色方案数
// 2 <= m <= 1e5，1 <= n <= 1e9，P = 1e9 + 7
// 相关帖子 ：https://www.cnblogs.com/dx123/p/17031773.html
// 相关帖子 ：https://oi-wiki.org/math/combinatorics/combination/#%E4%BA%8C%E9%A1%B9%E5%BC%8F%E5%8F%8D%E6%BC%94

#include <bits/stdc++.h>

using namespace std;

#define ll long long
const int MAXM = 100005;
const int P = 1e9 + 7;
int n, m;
ll a[MAXM], b[MAXM];

ll quickPow(ll x, ll y)
{
    ll ans = 1;
    while(y)
    {
        if(y & 1) ans = ans * x % P;
        x = x * x % P;
        y >>= 1;
    }
    return ans;
}

void init()
{
    // a[i] = i!，b[i] 是 a[i] 的乘法逆元
    a[0] = b[0] = 1;
    for(int i = 1; i < MAXM; ++i)
    {
        a[i] = a[i - 1] * i % P;
        b[i] = b[i - 1] * quickPow(i, P - 2) % P;
    }
}

ll C(ll n, ll m)
{
    return a[n] * b[m] % P * b[n - m] % P;
}

int main()
{
    init();
    scanf("%d%d", &n, &m);
    int ans = 0, s;
    for(int i = 2; i <= m; ++i)
    {
        s = C(m, i) * i % P * quickPow(i - 1, n - 1) % P;
        if((m - i) & 1)
            ans = (ans - s + P) % P;
        else
            ans = (ans + s) % P;
    }
    printf("%d\n", ans);

    return 0;
}